// 版权所有 Epic Games, Inc. 保留所有权利。

#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"
#include "Templates/SubclassOf.h"

#include "LyraDevelopmentStatics.generated.h"

class UClass;
class UObject;
class UWorld;
struct FAssetData;
struct FFrame;

UCLASS()
class ULyraDevelopmentStatics : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	// 游戏逻辑是否应该直接跳转到游戏玩法（跳过任何比赛热身/等待玩家/等方面）
	// 除了在编辑器中播放且bTestFullGameFlowInPIE（在Lyra开发者设置中）为false时，否则始终返回false
	UFUNCTION(BlueprintCallable, Category="Lyra")
	static bool ShouldSkipDirectlyToGameplay();

	// 游戏逻辑是否应该在编辑器中加载装饰性背景？
	// 除了在编辑器中播放且bSkipLoadingCosmeticBackgroundsInPIE（在Lyra开发者设置中）为true时，否则始终返回true
	UFUNCTION(BlueprintCallable, Category = "Lyra", meta=(ExpandBoolAsExecs="ReturnValue"))
	static bool ShouldLoadCosmeticBackgrounds();

	// 游戏逻辑是否应该在编辑器中加载装饰性背景？
	// 除了在编辑器中播放且bSkipLoadingCosmeticBackgroundsInPIE（在Lyra开发者设置中）为true时，否则始终返回true
	UFUNCTION(BlueprintCallable, Category = "Lyra")
	static bool CanPlayerBotsAttack();

	// 查找最适合运行"服务器"作弊的编辑器内播放世界
	//   如果运行独立模式，这可能是唯一的世界、监听服务器或专用服务器
	static UWorld* FindPlayInEditorAuthorityWorld();

	// 尝试通过短名称查找类（使用一些启发式方法来提高通过作弊控制台使用时的可用性）
	static UClass* FindClassByShortName(const FString& SearchToken, UClass* DesiredBaseClass, bool bLogFailures = true);

	template <typename DesiredClass>
	static TSubclassOf<DesiredClass> FindClassByShortName(const FString& SearchToken, bool bLogFailures = true)
	{
		return FindClassByShortName(SearchToken, DesiredClass::StaticClass(), bLogFailures); // 调用通用查找方法
	}

private:
	static TArray<FAssetData> GetAllBlueprints(); // 获取所有蓝图
	static UClass* FindBlueprintClass(const FString& TargetNameRaw, UClass* DesiredBaseClass); // 查找蓝图类
};